// ligne 53 a completer pour q1.2
package question1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;

/** Classe de lecture d'un capteur sur le Web
 * @version de test
 * @author jm Douin
 */
public class HTTPSensor extends HumiditySensor
{
	public static final long ONE_MINUTE= 60L * 1000L;
	//  public final static String DEFAULT_HTTP_SENSOR= "http://lmi92.cnam.fr:8999/ds2438/";
	public final static String DEFAULT_HTTP_SENSOR= "http://localhost:8999/ds2438/";

	/** l'URL associee au capteur */
	private String urlSensor;

	/** Constructeur d'une connexion avec un Capteur, valeur par defaut
	 * @param  urlSensor l'URL du capteur sur le Web en protocole HTTP
	 */
	public HTTPSensor()
	{
		this( DEFAULT_HTTP_SENSOR );
	} // HTTPSensor()

	/** Constructeur d'une connexion avec un Capteur, syntaxe habituelle
	 * http://site:port/
	 * @param  urlSensor l'URL du capteur sur le Web en protocole HTTP
	 */
	public HTTPSensor( String urlSensor )
	{
		this.urlSensor= urlSensor;
	} // HTTPSensor()

	/**
	 * 	Lecture de la valeur de humidite relative
	 **/
	public float value() throws Exception
	{
		float value = 100F; // point de rosee
		StringTokenizer st = new StringTokenizer(this.request(),"=");
		if (st.hasMoreTokens()) {
			st.nextToken();
			value = (float)((int)(Float.parseFloat(st.nextToken())*10))/10;
		}
		return value; 
	} // value()

	// NE PAS MODIFIER :
	/** periode minimale de scrutation
	 * @return la periode minimale (en local ou a distance)
	 */
	public long minimalPeriod()
	{
		if ( !urlSensor.contains( ".cnam." ) )
			return 500L;
		else
			return ONE_MINUTE;
	} // minimalPeriod()

	/** lecture de l'URL
	 * @return l'url associee a ce capteur
	 */
	public String getUrl()
	{
		return this.urlSensor;
	} // getUrl()

	/** Lecture des informations issues de ce capteur
	 * @return la totalite de la page lue
	 * @throws Exception en cas d'erreur
	 */
	public String request() throws Exception
	{
		return request( new Properties() );
	} // request()

	/** Lecture des informations issues de ce capteur
	 * @param params les parametres 
	 * @return la totalite de la page lue
	 * @throws Exception en cas d'erreur
	 */
	public String request( Properties params ) throws Exception
	{
		String parametres= new String( "" );
		for ( Enumeration<Object> e= params.keys(); e.hasMoreElements(); ) {
			String key= (String)e.nextElement();
			String value= (String)params.get( key );
			parametres+= key + "=" + value;
			if ( e.hasMoreElements() )
				parametres+= "&";
		}
		if ( !parametres.equals( "" ) ) {
			urlSensor= urlSensor + "?" + parametres;
		}

		URL url= new URL( urlSensor );
		URLConnection connection= url.openConnection();

		BufferedReader in= new BufferedReader( new InputStreamReader( connection
				.getInputStream() ) );
		String result= new String( "" );
		String inputLine= in.readLine();
		while ( inputLine != null ) {
			result= result + inputLine;
			inputLine= in.readLine();
		}
		in.close();
		return result;
	} // request()

	/** Mise en place du proxy si necessaire
	 *  rappel a l'esiee : proxyHost=cache.esiee.fr proxyPort=3128
	 *  attention, aucune verification de la validite de l'URL transmise n'est effectuee
	 *  @param proxyHost adresse du proxy
	 *  @param proxyPort le port du proxy
	 */
	public static void setHttpProxy( String proxyHost, int proxyPort )
	{
		Properties prop= System.getProperties();
		prop.put( "proxySet", "true" );
		prop.put( "http.proxyHost", proxyHost );
		prop.put( "http.proxyPort", Integer.toString( proxyPort ) );
	} // setHttpProxy()

	// bloc d'initialisation statique pour l'esiee
	private static final boolean ESIEE_INSIDE= true;
	static {
		if ( ESIEE_INSIDE ) {
			setHttpProxy( "cache.esiee.fr", 3128 );
		}
	} // static
} // HTTPSensor
